package com.itheima.ydd.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.ydd.common.R;
import com.itheima.ydd.dto.PageInfo;
import com.itheima.ydd.dto.YddArticleDto;
import com.itheima.ydd.mapper.YddArticleMapper;
import com.itheima.ydd.pojo.YddArticle;
import com.itheima.ydd.pojo.YddCate;
import com.itheima.ydd.pojo.YddTag;
import com.itheima.ydd.service.YddArticleService;
import com.itheima.ydd.service.YddCateService;
import com.itheima.ydd.service.YddTagService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class YddArticleServiceImpl extends ServiceImpl<YddArticleMapper, YddArticle> implements YddArticleService {
    @Autowired
    private YddCateService yddCateService;
    @Autowired
    private YddTagService yddTagService;
    /**
     * 带条件的文章分页查询
     * @param start_time
     * @param end_time
     * @param title
     * @param cateid
     * @param page
     * @param limit
     * @return
     */
    @Override
    public ResponseEntity<R<PageInfo<YddArticleDto>>> findPageOrTitleOrCateOrTime(String start_time, String end_time, String title, String cateid, String page, String limit) {
        IPage<YddArticle> pg=new Page<>(Integer.parseInt(page),Integer.parseInt(limit));
        LambdaQueryWrapper<YddArticle> wrapper = new LambdaQueryWrapper<>();
        //标题的模糊查询
        wrapper.like(title!=null,YddArticle::getTitle,title);
        //起始时间的查询
        if(StringUtils.hasText(start_time)&&StringUtils.hasText(end_time)){
            wrapper.ge(YddArticle::getCreateDate,start_time);
            wrapper.le(YddArticle::getCreateDate,end_time);
        }
        if(StringUtils.hasText(cateid)){
            wrapper.eq(YddArticle::getCateid,cateid);
        }
        page(pg,wrapper);
        //创建响应分页对象
        IPage<YddArticleDto> dpg=new Page<>();
        BeanUtils.copyProperties(pg,dpg,"records");
        //获取分页数据
        List<YddArticleDto> yddArticleDtos=pg.getRecords().stream().map(yddArticle -> {
            YddArticleDto yddArticleDto=new YddArticleDto();
            BeanUtils.copyProperties(yddArticle,yddArticleDto);
            YddCate yddCate = yddCateService.getById(yddArticle.getCateid());
            if(yddCate!=null){
                yddArticleDto.setCateName(yddCate.getCatename());
            }
            return yddArticleDto;
        }).collect(Collectors.toList());
        dpg.setRecords(yddArticleDtos);
        PageInfo<YddArticleDto> pageInfo=new PageInfo<>();
        pageInfo.setCount((int) dpg.getTotal());
        pageInfo.setTotalPages((int) dpg.getPages());
        pageInfo.setPageSize((int) dpg.getSize());
        pageInfo.setCurrentPage((int) dpg.getCurrent());
        pageInfo.setData(dpg.getRecords());
        return ResponseEntity.ok(R.success(pageInfo));
    }

    /**
     * 添加文章
     * @param yddArticleDto
     */
    @Override
    public void saveArticle(YddArticleDto yddArticleDto) {
        save(yddArticleDto);
        //标签
        List<YddTag> yddTags=yddArticleDto.getYddTags();
        for (YddTag yddTag : yddTags) {
            yddTag.setId(yddArticleDto.getId());
        }
        yddTagService.saveBatch(yddTags);
    }

    @Override
    public YddArticleDto updateArticle(YddArticleDto yddArticleDto) {
        //先修改yddarticle里的数据
        updateById(yddArticleDto);
        //清理标签
        LambdaQueryWrapper<YddTag> wrapper=new LambdaQueryWrapper<>();
        wrapper.eq(YddTag::getTagname,yddArticleDto.getTags());
        yddTagService.remove(wrapper);
        //添加后来添加的标签
        List<YddTag> yddTags=yddArticleDto.getYddTags();
        for (YddTag yddTag : yddTags) {
            yddTag.setId(yddArticleDto.getId());
        }
        yddTagService.saveBatch(yddTags);
        return yddArticleDto;
    }
}
